//wait 和 waitpid 的使用
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/wait.h>


int main()
{
    //wait
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        exit(1);
    }
    if(id == 0)
    {
        //child
        printf("i am child process\n");
        sleep(5);
        exit(0);
    }
    else{
        //wait
        //parent
        //返回值成功返回子进程pid，失败返回-1
        // int st;
        // pid_t ret = wait(&st);
        // if(ret < 0)
        // {
        //     perror("wait");
        //     exit(2);
        // }
        // //低7位为0表示没有被信号杀死
        // else if(ret > 0 && (st & 0x7F) == 0)
        // {
        //     //没有被杀死意味着我们可以获取退出码
        //     printf("child exit code:%d\n",(st >> 8)&0xFF);
        // }
        // else 
        // {
        //     //被杀死了获取信号码,获取低7位
        //     printf("sig code:%d\n",st&0x7F);
        // }
        
        //waitpid
        int st;
        pid_t ret = waitpid(id,&st,0);
        //如果是非阻塞等待只有-1 和 子进程id两个返回值
        if(ret < 0)
        {
            perror("waitpid");
            exit(2);
        }

        if((st & 0x7F) == 0)
        {
            printf("child exit code:%d\n",(st>>8)&0xFF);
        }
        else{
            printf("sig code:%d\n",st&0x7F);
        }
    }
    return 0;
}